1. channel有分,單向、雙向,通常情況下,只說channel,就是指雙向channel。
那如何聲明單向通道?
var Chan = make(chan<- int, 1)
2. 在channel的宣告中,加入 <-,代表channel的方向
var sendChan = make(chan<- int, 1) //發送通道,只能發不能收
var recvChan = make(<-chan int, 1) //接收通道,只能收不能發
3. 單向通道的用途: 對其它程式碼(呼叫方)的約束
程式碼延伸知識點:
a. channel的關閉,盡量由sender端做。
b. 帶有range的for語句。for語句會不斷嘗試從 intChan 取出元素值,即使intChan被close,它還是會在取出所有剩餘的元素值後,在結束執行。
c. 帶有range的for語句。當intChan中沒有元素值,它會永遠阻塞在for的那一行。
d. 帶有range的for語句。如果當intChan的值為nil,那它會永遠阻塞在for的那一行。
package main
import (
"fmt"
)
func main() {
intChan := SendIntChan()
for v := range intChan {
fmt.Printf("The value in intChan: %d\n", v)
}
}
//返回 <-chan int 類型的 channel
//呼叫方,只能從channel接收元素值
func SendIntChan() <-chan int {
num := 5
ch := make(chan int, num)
for i := 0; i < num; i++ {
ch <- i
}
close(ch)
return ch
}
https://play.golang.org/p/a9Gw_ZJgL0b
package main
import (
"fmt"
)
func main() {
intChan := SendIntChan()
for v := range intChan {
fmt.Printf("The value in intChan: %d\n", v)
}
}
func SendIntChan() <-chan int {
ch := make(chan int, 5)
return ch
}
https://play.golang.org/p/J_-OaR8UZ9X
參考來源:
郝林-Go语言核心36讲